#include "app_message.h"
#include "cJSON/cJSON.h"
#include "string.h"
#include "stdlib.h"
#include "log/log.h"
#include "app_common.h"

/*
消息数据包含
    连接类型：1代表蓝牙连接
    设备id："xx"
    消息体内容：“abcd"
字符数组格式：124xxabcd
    字节1：连接类型
    字节2：设备id长度
    字节3：消息体长度
    字节4-n：设备id和消息体
json格式:["conn_type":1,"id":"5858","msg":"61626364"]
*/

/**
 * @brief 将字符数组消息转换为json消息
 *
 * @param chars 字符数组消息
 * @param chars_len 字符数组消息长度
 * @return char* json消息  生产的json消息
 */
char *app_message_charsTojson(char *chars, int chars_len)
{
    // 从chars中提取出 conn_type, id_len, mas_len, id, msg
    int conn_type = chars[0];
    int id_len = chars[1];
    int msg_len = chars[2];
    char id[id_len];
    char msg[msg_len];
    memcpy(id, chars + 3, id_len);
    memcpy(msg, chars + 3 + id_len, msg_len);

    // 生成id和msg对应的 16进制字符串 id_hex, msg_hex
    char *id_hex = app_common_charsToHexstr(id, id_len);
    char *msg_hex = app_common_charsToHexstr(msg, msg_len);

    // 生成json字符串消息
    cJSON *json = cJSON_CreateObject();
    cJSON_AddNumberToObject(json, "conn_type", conn_type);
    cJSON_AddStringToObject(json, "id", id_hex);
    cJSON_AddStringToObject(json, "msg", msg_hex);
    char *json_str = cJSON_PrintUnformatted(json);

    // 释放json字符串消息
    cJSON_Delete(json);

    // 释放id_hex, msg_hex
    free(id_hex);
    free(msg_hex);

    // 返回json字符串消息
    return json_str;
}

/**
 * @brief 将json消息转换为字符数组消息
 *
 * @param json json消息
 * @param chars_buf 字符数组消息缓冲区
 * @param buf_len 字符数组消息缓冲区长度
 * @return int 字符数组消息长度 生产的字符数组消息长度
 */
int app_message_jsonTochars(char *json, char *chars_buf, int buf_len)
{
    // 解析json字符串消息 得到 conn_type, id_hex, msg_hex
    cJSON *json_obj = cJSON_Parse(json);
    int conn_type = cJSON_GetObjectItem(json_obj, "conn_type")->valueint;
    char *id_hex = cJSON_GetObjectItem(json_obj, "id")->valuestring;
    char *msg_hex = cJSON_GetObjectItem(json_obj, "msg")->valuestring;

    // 将id_hex和msg_hex转换为对应的字符数组id和msg，并得到其长度id_len和msg_len
    int id_len = 0;
    int msg_len = 0;
    char *id = app_common_hexstrToChars(id_hex, &id_len);
    char *msg = app_common_hexstrToChars(msg_hex, &msg_len);

    // 计算数据长度校验
    int data_len = 3 + id_len + msg_len;
    if (data_len > buf_len)
    {
        log_error("数据长度超出缓冲区长度");
        return -1;
    }

    // 将conn_type, id, msg, id_len, msg_len 填充到chars_buf中
    chars_buf[0] = conn_type;
    chars_buf[1] = id_len;
    chars_buf[2] = msg_len;
    memcpy(chars_buf + 3, id, id_len);
    memcpy(chars_buf + 3 + id_len, msg, msg_len);

    // 释放内存
    cJSON_Delete(json_obj);

    // 返回字符数组消息长度
    return data_len;
}